1 Assaults

The ICE G-324A Significant Incident Summary sheet contains information on a number of different kinds of assaults. Specifically, there are four categories of assaults listed:

  • Detained Person on Staff with Serious Injury
  • Detained Person on Staff without Serious Injury
  • Detained Person on Detained Person with Serious Injury
  • Detained Person on Detained Person without Serious Injury

Conspicuously absent from this list of assault types are assaults on detained persons by staff. This is deeply concerning because already initial review of inspection forms and prior news stories indicates that staff assaults on detained persons do occur. For example, at the Bristol County County Jail and House of Corrections independent investigation by the Massachusetts Office of Attorney General (MAOG) found that facility staff found a “planned and deliberate-use of force against the ICE detainees that was disproportionate to the security needs at that time and unnecessarily caused, or risked causing, harm to all involved” (MA AG 2020, ii). The MOAG found that facility staff used “a flash bang grenade, pepper-ball launchers, pepper spray canisters, anti-riot shields, and canines–against detainees who had exhibited calm and nonviolent behavior for at least an hour before this operation” (MA AG 2020, ii). Investigations found that staff “deployed these weapons both indiscriminately upon entry and also specifically against detainees who were not combative, assaultive, or otherwise actively resisting staff” (MA AG 2020, ii).

While the aforementioned Bristol County Jail may be a particularly egregious instance of staff assaulting detained persons, it is not an isolated case. For example, video evidence from the Torrance County Detention Facility in Estancia NM shows CoreCivic’s private facility staff pepper spraying persons detained by ICE on hunger strike (Swetlitz 2020). Review of inspections has also revealed additional inappropriate use of force incidents. The omission of a field to record instances of staff assaulting detained persons occludes and obscures real instances of violence. As the inspections process is a detention reform designed to make a more humane system of civil incarceration, the omission of categories for logging staff physical mistreatment of detained persons raises serious questions about the inspections processes ability to record significant and documented civil and human rights violations.

1.1 Summary Tables

# Load necessary libraries

# Reading and wrangling
library(googlesheets4)
library(readr)
library(tidyverse)
library(janitor)
library(lubridate)
library(DT)

# Plotting
library(ggplot2)
library(RColorBrewer)

# Tables
library(kableExtra)

# Load custom function
source("function_clean_facility_names.R", local = knitr::knit_global())
# Read Google Sheet incident worksheet, convert to data frame, and wrangle
df_324_inc <- read_sheet("https://docs.google.com/spreadsheets/d/1im5VSi3bIEi13O8WQ56wEIXSyNEstbGMylXXgD9bAG0/edit#gid=1858227071",
                 sheet="G-324A-19-inc",
                 col_types = "c") %>% 
  clean_names() %>%
  
  # Run custom cleaning function
  clean_facility_names() %>% 


  # df_specific changes
  unite(date, year:month) %>% 
  mutate(facility = as.factor(facility),
         state = as.factor(state),
         date = ym(date)
         ) %>% 
  mutate_at(c(6:76), as.numeric)
## Reading from "000inspection_forms"
## Range "'G-324A-19-inc'"
## New names:
## * `Sexual abuse allegations detainee on staff/contractor/volunteer` -> `Sexual abuse allegations detainee on staff/contractor/volunteer...29`
## * `Sexual abuse allegations detainee on staff/contractor/volunteer` -> `Sexual abuse allegations detainee on staff/contractor/volunteer...34`
## Warning: Expected 2 pieces. Missing pieces filled with `NA` in 12 rows [2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152,
## 2153, 2154, 2155].
## Warning: 1 failed to parse.
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion

## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
df_assaults <- df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       detainee_physical_assault_on_staff_with_serious_injury:
       detainee_on_detainee_physical_assault_fight_with_no_serious_injury
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_assaults = sum(c_across(
       detainee_physical_assault_on_staff_with_serious_injury:
       detainee_on_detainee_physical_assault_fight_with_no_serious_injury
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  detainee_physical_assault_on_staff_with_serious_injury:total_assaults,
               names_to = "assault_type",
               values_to = "assault_count") %>% 
  
  # Remove NA Values
  drop_na() %>% 
  
  # Explicitly define factor levels
  mutate(assault_type = factor(assault_type, levels = c(
    "detainee_physical_assault_on_staff_with_serious_injury",
    "detainee_physical_assault_on_staff_with_no_serious_injury",
    "detainee_on_detainee_physical_assault_fight_with_serious_injury",
    "detainee_on_detainee_physical_assault_fight_with_no_serious_injury",
    "total_assaults"
  )))
df_assaults %>% 
  group_by(assault_type) %>% 
  summarise(`Total Assaults by Type` = sum(assault_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Assaults by Type",
        col.names = c("Assault Type", "Total Assault Type")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 1.1: Total Assaults by Type
Assault Type Total Assault Type
detainee_physical_assault_on_staff_with_serious_injury 13
detainee_physical_assault_on_staff_with_no_serious_injury 333
detainee_on_detainee_physical_assault_fight_with_serious_injury 126
detainee_on_detainee_physical_assault_fight_with_no_serious_injury 2926
total_assaults 3390
df_assaults %>% 
  group_by(facility) %>% 
  summarise(total_assaults = sum(assault_count)) %>% 
  arrange(desc(total_assaults)) %>% 
  ungroup() %>% 
  kable(caption = "Total Assaults by Facility",
        col.names = c("Facility", "Total Assaults by Facility")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 1.1: Total Assaults by Facility
Facility Total Assaults by Facility
Krome Service Processing Center 470
Adelanto ICE Processing Center - West 390
Prairieland Detention Center 330
South Texas ICE Processing Center 312
Adelanto ICE Processing Center - East 264
Otero County Processing Center 240
Aurora ICE Processing Center 222
Aurora ICE Processing Center II - Annex 222
Stewart Detention Center 218
Eloy Detention Center 216
Otay Mesa Detention Center 200
El Paso Service Processing Center 192
Winn Correctional Center 172
Essex County Correctional Facility 146
Imperial Regional Detention Facility 136
LaSalle ICE Processing Center 128
Hudson County Corrections and Rehabilitation Center 118
Immigration Centers of America - Farmville 108
River Correctional Center 106
Caroline Detention Facility 104
Jena LaSalle Detention Facility 98
Yuba County Jail 96
Adams County Correctional Center 94
La Palma Correctional Center 92
Bergen County Jail 86
Northwest ICE Processing Center 78
Catahoula Correctional Center 72
Mesa Verde ICE Processing Facility 72
Port Isabel Service Processing Center 70
Folkston ICE Processing Center 68
Bluebonnet Detention Center 64
Montgomery Processing Center 60
Pulaski County Detention Center 60
Sherburne County Jail 60
Houston Contract Detention Facility 58
Pine Prairie ICE Processing Center 58
Baker County Detention Center 54
Calhoun County Correctional Center 54
Limestone County Detention Center 50
Polk County Adult Detention Center 50
Irwin County Detention Center 48
McHenry County Adult Correctional Facility 48
Strafford County Department of Corrections 46
Allen Parish Public Safety Complex 45
Krome North Service Processing Center 40
Elizabeth Contract Detention Facility 34
Nye County Detention Center 34
Pike County Correctional Facility 32
Webb County Detention Center 32
CCA Florence Correctional Center 30
Joe Corley Processing Center 30
Wakulla County Detention Facility 30
David L. Moss Criminal Justice Center 28
Johnson County Corrections Center 28
Orange County Correctional Facility 26
Richwood Correctional Center 26
Bossier Parish Corrections Center 24
Florence Service Processing Center 24
Folkston ICE Processing Center Annex 24
Freeborn County Adult Detention Center 24
Okmulgee County Jail - Moore Detention Facility 24
Clinton County Correctional Facility 22
Jackson Parish Correctional Center 22
Rio Grande Detention Center 22
Bristol County Jail and House of Correction 20
Morgan County Adult Detention Center 20
Plymouth County Correctional Facility 20
Cambria County Prison 18
Glades County Detention Center 16
Hall County Department of Corrections 16
York County Prison 16
Henderson Detention Center 14
Seneca County Jail 14
Broward Transitional Center 12
Butler County Jail 12
Donald W. Wyatt Detention Facility 12
Hardin County Jail 12
Torrance County Detention Facility 12
Coastal Bend Detention Center 10
Dodge County Detention Facility 10
Eden Detention Center 10
El Valle Detention Facility 10
Howard County Detention Center 10
Boone County Jail 8
Sheriff Al Cannon Detention Center 8
Worcester County Jail 7
Geauga County Jail 6
Jerome Combs Detention Center 6
Kay County Detention Center 6
Montgomery County Jail 6
Saint Clair County Jail 6
Val Verde Correctional Facility 6
Clay County Jail 4
Laredo Processing Center 4
Northern Oregon Correctional Facility 4
San Luis Regional Detention Center 4
Teller County Jail 4
Carver County Jail 2
Cass County Jail 2
Monroe County Inmate Dormitory 2
Rolling Plains Detention Center 2
Shawnee County Department of Corrections - Adult Detention Center 2
South Louisiana ICE Processing Center 2
West Texas Detention Facility 2
Alamance County Detention Center 0
Brooks County Detention Center 0
Chippewa County Correctional Facility 0
Christian County Jail 0
Cibola County Correctional Center 0
Desert View Annex 0
Dorchester County Detention Center 0
Douglas County Department of Corrections 0
East Hidalgo Detention Center 0
Golden State Annex 0
LaSalle Correctional Center 0
LaSalle County Regional Detention Center 0
Morrow County Correctional Facility 0
Platte County Detention Center 0
Robert A. Deyton Detention Facility 0
T. Don Hutto Residential Center 0
Washoe County Detention Center 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0

1.2 Facet Plot of Assaults by Facility

The figure below is a facet plot of the assault categories present on the G-324A SIS form.

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(5, "Paired")
plot_colors[5] <- "#000000"

# Create the labels
plot_labels <- c(
    "Detained Person on Staff w. Serious Injury",
    "Detained Person on Staff w/o Serious Injury",
    "Detained Person on Detained Person w. Serous Injury",
    "Detained Person on Detained Person w/o Serous Injury",
    "Total Assaults")

df_assaults %>% 
  # Calling the plot and formatting
  ggplot(aes(x=date, y = assault_count, linetype=assault_type))+
  geom_line(aes(color = assault_type), size =.65) +
  
  # Set the line type
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Assault Type:",
    guide = guide_legend(nrow = 5)
    )+
  
  # Setting the color
  scale_color_manual(
    values = plot_colors,
    labels = plot_labels,
  name = "Assault Type:"
  )+

  labs(title = "Reported Assaults")+
  ylab("Number of Assaults")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =5))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

MA AG. 2020. “Investigation into the Events of May 1, 2020 at the c. Carlos Carreiro Immigration Detention Center, Unit b, Bristol County Sheriffs Office.” Boston, MA. https://www.mass.gov/doc/ago-report-into-bcso-response-to-may-1-disturbance/download.
Swetlitz, Ike. 2020. “’Suddenly They Started Gassing Us’: Cuban Migrants Tell of Shocking Attack at ICE Prison.” https://www.theguardian.com/us-news/2020/jul/02/cuban-migrants-detention-ice-facility-new-mexico.
LS0tDQp0aXRsZTogIkFzc2F1bHRzIg0KYXV0aG9yOiAiTmF0aGFuIENyYWlnIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUEgJUIgJWQsICVZJylgIg0Kb3V0cHV0Og0KICBib29rZG93bjo6aHRtbF9kb2N1bWVudDI6IA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCmJpYmxpb2dyYXBoeTogW2NpdGF0aW9ucy5iaWIsIHBhY2thZ2VzLmJpYl0NCi0tLQ0KDQojIEFzc2F1bHRzDQoNClRoZSBJQ0UgRy0zMjRBIFNpZ25pZmljYW50IEluY2lkZW50IFN1bW1hcnkgc2hlZXQgY29udGFpbnMgaW5mb3JtYXRpb24gb24gYSBudW1iZXIgb2YgZGlmZmVyZW50IGtpbmRzIG9mIGFzc2F1bHRzLiBTcGVjaWZpY2FsbHksIHRoZXJlIGFyZSBmb3VyIGNhdGVnb3JpZXMgb2YgYXNzYXVsdHMgbGlzdGVkOg0KDQotICAgRGV0YWluZWQgUGVyc29uIG9uIFN0YWZmIHdpdGggU2VyaW91cyBJbmp1cnkNCi0gICBEZXRhaW5lZCBQZXJzb24gb24gU3RhZmYgd2l0aG91dCBTZXJpb3VzIEluanVyeQ0KLSAgIERldGFpbmVkIFBlcnNvbiBvbiBEZXRhaW5lZCBQZXJzb24gd2l0aCBTZXJpb3VzIEluanVyeQ0KLSAgIERldGFpbmVkIFBlcnNvbiBvbiBEZXRhaW5lZCBQZXJzb24gd2l0aG91dCBTZXJpb3VzIEluanVyeQ0KDQpDb25zcGljdW91c2x5IGFic2VudCBmcm9tIHRoaXMgbGlzdCBvZiBhc3NhdWx0IHR5cGVzIGFyZSBhc3NhdWx0cyBvbiBkZXRhaW5lZCBwZXJzb25zIGJ5IHN0YWZmLiBUaGlzIGlzIGRlZXBseSBjb25jZXJuaW5nIGJlY2F1c2UgYWxyZWFkeSBpbml0aWFsIHJldmlldyBvZiBpbnNwZWN0aW9uIGZvcm1zIGFuZCBwcmlvciBuZXdzIHN0b3JpZXMgaW5kaWNhdGVzIHRoYXQgc3RhZmYgYXNzYXVsdHMgb24gZGV0YWluZWQgcGVyc29ucyBkbyBvY2N1ci4gRm9yIGV4YW1wbGUsIGF0IHRoZSBCcmlzdG9sIENvdW50eSBDb3VudHkgSmFpbCBhbmQgSG91c2Ugb2YgQ29ycmVjdGlvbnMgaW5kZXBlbmRlbnQgaW52ZXN0aWdhdGlvbiBieSB0aGUgTWFzc2FjaHVzZXR0cyBPZmZpY2Ugb2YgQXR0b3JuZXkgR2VuZXJhbCAoTUFPRykgZm91bmQgdGhhdCBmYWNpbGl0eSBzdGFmZiBmb3VuZCBhICJwbGFubmVkIGFuZCBkZWxpYmVyYXRlLXVzZSBvZiBmb3JjZSBhZ2FpbnN0IHRoZSBJQ0UgZGV0YWluZWVzIHRoYXQgd2FzIGRpc3Byb3BvcnRpb25hdGUgdG8gdGhlIHNlY3VyaXR5IG5lZWRzIGF0IHRoYXQgdGltZSBhbmQgdW5uZWNlc3NhcmlseSBjYXVzZWQsIG9yIHJpc2tlZCBjYXVzaW5nLCBoYXJtIHRvIGFsbCBpbnZvbHZlZCIgW0BtYWFnMjAyMCwgaWldLiBUaGUgTU9BRyBmb3VuZCB0aGF0IGZhY2lsaXR5IHN0YWZmIHVzZWQgImEgZmxhc2ggYmFuZyBncmVuYWRlLCBwZXBwZXItYmFsbCBsYXVuY2hlcnMsIHBlcHBlciBzcHJheSBjYW5pc3RlcnMsIGFudGktcmlvdCBzaGllbGRzLCBhbmQgY2FuaW5lcy0tYWdhaW5zdCBkZXRhaW5lZXMgd2hvIGhhZCBleGhpYml0ZWQgY2FsbSBhbmQgbm9udmlvbGVudCBiZWhhdmlvciBmb3IgYXQgbGVhc3QgYW4gaG91ciBiZWZvcmUgdGhpcyBvcGVyYXRpb24iIFtAbWFhZzIwMjAsIGlpXS4gSW52ZXN0aWdhdGlvbnMgZm91bmQgdGhhdCBzdGFmZiAiZGVwbG95ZWQgdGhlc2Ugd2VhcG9ucyBib3RoIGluZGlzY3JpbWluYXRlbHkgdXBvbiBlbnRyeSBhbmQgYWxzbyBzcGVjaWZpY2FsbHkgYWdhaW5zdCBkZXRhaW5lZXMgd2hvIHdlcmUgbm90IGNvbWJhdGl2ZSwgYXNzYXVsdGl2ZSwgb3Igb3RoZXJ3aXNlIGFjdGl2ZWx5IHJlc2lzdGluZyBzdGFmZiIgW0BtYWFnMjAyMCwgaWldLg0KDQpXaGlsZSB0aGUgYWZvcmVtZW50aW9uZWQgQnJpc3RvbCBDb3VudHkgSmFpbCBtYXkgYmUgYSBwYXJ0aWN1bGFybHkgZWdyZWdpb3VzIGluc3RhbmNlIG9mIHN0YWZmIGFzc2F1bHRpbmcgZGV0YWluZWQgcGVyc29ucywgaXQgaXMgbm90IGFuIGlzb2xhdGVkIGNhc2UuIEZvciBleGFtcGxlLCBbdmlkZW8gZXZpZGVuY2VdKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9SlBfUGZPaGRMdU0pIGZyb20gdGhlIFRvcnJhbmNlIENvdW50eSBEZXRlbnRpb24gRmFjaWxpdHkgaW4gRXN0YW5jaWEgTk0gc2hvd3MgQ29yZUNpdmljJ3MgcHJpdmF0ZSBmYWNpbGl0eSBzdGFmZiBwZXBwZXIgc3ByYXlpbmcgcGVyc29ucyBkZXRhaW5lZCBieSBJQ0Ugb24gaHVuZ2VyIHN0cmlrZSBbQHN3ZXRsaXR6MjAyMF0uIFJldmlldyBvZiBpbnNwZWN0aW9ucyBoYXMgYWxzbyByZXZlYWxlZCBhZGRpdGlvbmFsIGluYXBwcm9wcmlhdGUgdXNlIG9mIGZvcmNlIGluY2lkZW50cy4gVGhlIG9taXNzaW9uIG9mIGEgZmllbGQgdG8gcmVjb3JkIGluc3RhbmNlcyBvZiBzdGFmZiBhc3NhdWx0aW5nIGRldGFpbmVkIHBlcnNvbnMgb2NjbHVkZXMgYW5kIG9ic2N1cmVzIHJlYWwgaW5zdGFuY2VzIG9mIHZpb2xlbmNlLiBBcyB0aGUgaW5zcGVjdGlvbnMgcHJvY2VzcyBpcyBhIGRldGVudGlvbiByZWZvcm0gZGVzaWduZWQgdG8gbWFrZSBhIG1vcmUgaHVtYW5lIHN5c3RlbSBvZiBjaXZpbCBpbmNhcmNlcmF0aW9uLCB0aGUgb21pc3Npb24gb2YgY2F0ZWdvcmllcyBmb3IgbG9nZ2luZyBzdGFmZiBwaHlzaWNhbCBtaXN0cmVhdG1lbnQgb2YgZGV0YWluZWQgcGVyc29ucyByYWlzZXMgc2VyaW91cyBxdWVzdGlvbnMgYWJvdXQgdGhlIGluc3BlY3Rpb25zIHByb2Nlc3NlcyBhYmlsaXR5IHRvIHJlY29yZCBzaWduaWZpY2FudCBhbmQgZG9jdW1lbnRlZCBjaXZpbCBhbmQgaHVtYW4gcmlnaHRzIHZpb2xhdGlvbnMuDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCiMjIFN1bW1hcnkgVGFibGVzDQoNCmBgYHtyIGxvYWQtbGlicmFyaWVzfQ0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCg0KIyBSZWFkaW5nIGFuZCB3cmFuZ2xpbmcNCmxpYnJhcnkoZ29vZ2xlc2hlZXRzNCkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoamFuaXRvcikNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShEVCkNCg0KIyBQbG90dGluZw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQoNCiMgVGFibGVzDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCiMgTG9hZCBjdXN0b20gZnVuY3Rpb24NCnNvdXJjZSgiZnVuY3Rpb25fY2xlYW5fZmFjaWxpdHlfbmFtZXMuUiIsIGxvY2FsID0ga25pdHI6OmtuaXRfZ2xvYmFsKCkpDQpgYGANCg0KYGBge3IgcmVhZC1kYXRhLTMyNC1pbmNpZGVudH0NCiMgUmVhZCBHb29nbGUgU2hlZXQgaW5jaWRlbnQgd29ya3NoZWV0LCBjb252ZXJ0IHRvIGRhdGEgZnJhbWUsIGFuZCB3cmFuZ2xlDQpkZl8zMjRfaW5jIDwtIHJlYWRfc2hlZXQoImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFpbTVWU2kzYklFaTEzTzhXUTU2d0VJWFN5TkVzdGJHTXlsWFhnRDliQUcwL2VkaXQjZ2lkPTE4NTgyMjcwNzEiLA0KICAgICAgICAgICAgICAgICBzaGVldD0iRy0zMjRBLTE5LWluYyIsDQogICAgICAgICAgICAgICAgIGNvbF90eXBlcyA9ICJjIikgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JQ0KICANCiAgIyBSdW4gY3VzdG9tIGNsZWFuaW5nIGZ1bmN0aW9uDQogIGNsZWFuX2ZhY2lsaXR5X25hbWVzKCkgJT4lIA0KDQoNCiAgIyBkZl9zcGVjaWZpYyBjaGFuZ2VzDQogIHVuaXRlKGRhdGUsIHllYXI6bW9udGgpICU+JSANCiAgbXV0YXRlKGZhY2lsaXR5ID0gYXMuZmFjdG9yKGZhY2lsaXR5KSwNCiAgICAgICAgIHN0YXRlID0gYXMuZmFjdG9yKHN0YXRlKSwNCiAgICAgICAgIGRhdGUgPSB5bShkYXRlKQ0KICAgICAgICAgKSAlPiUgDQogIG11dGF0ZV9hdChjKDY6NzYpLCBhcy5udW1lcmljKQ0KYGBgDQoNCmBgYHtyIGFzc2F1bHQtZGZ9DQpkZl9hc3NhdWx0cyA8LSBkZl8zMjRfaW5jICU+JQ0KICANCiAgIyBTdWJzZXQgdGhlIGRmIHRvIG9ubHkgdGhlIHVzZWQgY29scw0KICBzZWxlY3QoaWQsIGZhY2lsaXR5LCBkYXRlLA0KICAgICAgIGRldGFpbmVlX3BoeXNpY2FsX2Fzc2F1bHRfb25fc3RhZmZfd2l0aF9zZXJpb3VzX2luanVyeToNCiAgICAgICBkZXRhaW5lZV9vbl9kZXRhaW5lZV9waHlzaWNhbF9hc3NhdWx0X2ZpZ2h0X3dpdGhfbm9fc2VyaW91c19pbmp1cnkNCiAgICAgICApICU+JSANCiAgDQogICMgTmVlZCB0aGUgcm93d2lzZSBmdW5jdGlvbiB0byBjb21wdXRlIGEgcm93LWF0LWEtdGltZQ0KICAjIGluIHRoZSBmb2xsb3dpbmcgbXV0YXRlIGZ1bmN0aW9uDQogIHJvd3dpc2UoaWQpICU+JSANCiAgDQogICMgQ3JlYXRlIGEgbmV3IHRvdGFsIGNvbHVtbg0KICBtdXRhdGUodG90YWxfYXNzYXVsdHMgPSBzdW0oY19hY3Jvc3MoDQogICAgICAgZGV0YWluZWVfcGh5c2ljYWxfYXNzYXVsdF9vbl9zdGFmZl93aXRoX3NlcmlvdXNfaW5qdXJ5Og0KICAgICAgIGRldGFpbmVlX29uX2RldGFpbmVlX3BoeXNpY2FsX2Fzc2F1bHRfZmlnaHRfd2l0aF9ub19zZXJpb3VzX2luanVyeQ0KICApKSkgJT4lIA0KDQogICMgQ2FsbCBhIHJhbmdlIG9mIHRhYmxlIGNvbHVtbnMgYW5kIHBpdm90IGxvbmcNCiAgcGl2b3RfbG9uZ2VyKC4sDQogICAgICAgICAgICAgICBjb2xzPSAgZGV0YWluZWVfcGh5c2ljYWxfYXNzYXVsdF9vbl9zdGFmZl93aXRoX3NlcmlvdXNfaW5qdXJ5OnRvdGFsX2Fzc2F1bHRzLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiYXNzYXVsdF90eXBlIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJhc3NhdWx0X2NvdW50IikgJT4lIA0KICANCiAgIyBSZW1vdmUgTkEgVmFsdWVzDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgZGVmaW5lIGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKGFzc2F1bHRfdHlwZSA9IGZhY3Rvcihhc3NhdWx0X3R5cGUsIGxldmVscyA9IGMoDQogICAgImRldGFpbmVlX3BoeXNpY2FsX2Fzc2F1bHRfb25fc3RhZmZfd2l0aF9zZXJpb3VzX2luanVyeSIsDQogICAgImRldGFpbmVlX3BoeXNpY2FsX2Fzc2F1bHRfb25fc3RhZmZfd2l0aF9ub19zZXJpb3VzX2luanVyeSIsDQogICAgImRldGFpbmVlX29uX2RldGFpbmVlX3BoeXNpY2FsX2Fzc2F1bHRfZmlnaHRfd2l0aF9zZXJpb3VzX2luanVyeSIsDQogICAgImRldGFpbmVlX29uX2RldGFpbmVlX3BoeXNpY2FsX2Fzc2F1bHRfZmlnaHRfd2l0aF9ub19zZXJpb3VzX2luanVyeSIsDQogICAgInRvdGFsX2Fzc2F1bHRzIg0KICApKSkNCmBgYA0KDQpgYGB7ciBhc3NhdWx0LXN1bW1hcnl9DQpkZl9hc3NhdWx0cyAlPiUgDQogIGdyb3VwX2J5KGFzc2F1bHRfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYFRvdGFsIEFzc2F1bHRzIGJ5IFR5cGVgID0gc3VtKGFzc2F1bHRfY291bnQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG90YWwgQXNzYXVsdHMgYnkgVHlwZSIsDQogICAgICAgIGNvbC5uYW1lcyA9IGMoIkFzc2F1bHQgVHlwZSIsICJUb3RhbCBBc3NhdWx0IFR5cGUiKSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGMoImhvdmVyIiwgInN0cmlwZWQiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkNCg0KDQpkZl9hc3NhdWx0cyAlPiUgDQogIGdyb3VwX2J5KGZhY2lsaXR5KSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9hc3NhdWx0cyA9IHN1bShhc3NhdWx0X2NvdW50KSkgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfYXNzYXVsdHMpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG90YWwgQXNzYXVsdHMgYnkgRmFjaWxpdHkiLA0KICAgICAgICBjb2wubmFtZXMgPSBjKCJGYWNpbGl0eSIsICJUb3RhbCBBc3NhdWx0cyBieSBGYWNpbGl0eSIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKSAlPiUgDQogIHNjcm9sbF9ib3goaGVpZ2h0ID0gIjMwMHB4IikNCmBgYA0KDQojIyBGYWNldCBQbG90IG9mIEFzc2F1bHRzIGJ5IEZhY2lsaXR5DQoNClRoZSBmaWd1cmUgYmVsb3cgaXMgYSBmYWNldCBwbG90IG9mIHRoZSBhc3NhdWx0IGNhdGVnb3JpZXMgcHJlc2VudCBvbiB0aGUgRy0zMjRBIFNJUyBmb3JtLg0KDQpgYGB7ciBhc3NhdWx0LWZhY2V0LCBmaWcuaGVpZ2h0PTQwfQ0KDQojIEdlbmVyYXRpbmcgYSBsaW5ldHlwZSB2ZWN0b3IgZm9yIHVzZSBpbiB0aGUgcGxvdA0KcGxvdF9saW5lcyA8LSBjKA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgImRvdHRlZCINCiAgICApDQoNCiMgVXNlIENvbG9yIEJyZXdlciB0byBzZXQgY29sb3JzIGFuZCBtb2RpZnkNCiMgdGhlIGxhc3QgY29sb3IgdG8gYmUgYmxhY2sgZm9yIHRvdGFscy4NCnBsb3RfY29sb3JzIDwtIGJyZXdlci5wYWwoNSwgIlBhaXJlZCIpDQpwbG90X2NvbG9yc1s1XSA8LSAiIzAwMDAwMCINCg0KIyBDcmVhdGUgdGhlIGxhYmVscw0KcGxvdF9sYWJlbHMgPC0gYygNCiAgICAiRGV0YWluZWQgUGVyc29uIG9uIFN0YWZmIHcuIFNlcmlvdXMgSW5qdXJ5IiwNCiAgICAiRGV0YWluZWQgUGVyc29uIG9uIFN0YWZmIHcvbyBTZXJpb3VzIEluanVyeSIsDQogICAgIkRldGFpbmVkIFBlcnNvbiBvbiBEZXRhaW5lZCBQZXJzb24gdy4gU2Vyb3VzIEluanVyeSIsDQogICAgIkRldGFpbmVkIFBlcnNvbiBvbiBEZXRhaW5lZCBQZXJzb24gdy9vIFNlcm91cyBJbmp1cnkiLA0KICAgICJUb3RhbCBBc3NhdWx0cyIpDQoNCmRmX2Fzc2F1bHRzICU+JSANCiAgIyBDYWxsaW5nIHRoZSBwbG90IGFuZCBmb3JtYXR0aW5nDQogIGdncGxvdChhZXMoeD1kYXRlLCB5ID0gYXNzYXVsdF9jb3VudCwgbGluZXR5cGU9YXNzYXVsdF90eXBlKSkrDQogIGdlb21fbGluZShhZXMoY29sb3IgPSBhc3NhdWx0X3R5cGUpLCBzaXplID0uNjUpICsNCiAgDQogICMgU2V0IHRoZSBsaW5lIHR5cGUNCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKA0KICAgIHZhbHVlcyA9IHBsb3RfbGluZXMsDQogICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogICAgbmFtZSA9ICJBc3NhdWx0IFR5cGU6IiwNCiAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZChucm93ID0gNSkNCiAgICApKw0KICANCiAgIyBTZXR0aW5nIHRoZSBjb2xvcg0KICBzY2FsZV9jb2xvcl9tYW51YWwoDQogICAgdmFsdWVzID0gcGxvdF9jb2xvcnMsDQogICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogIG5hbWUgPSAiQXNzYXVsdCBUeXBlOiINCiAgKSsNCg0KICBsYWJzKHRpdGxlID0gIlJlcG9ydGVkIEFzc2F1bHRzIikrDQogIHlsYWIoIk51bWJlciBvZiBBc3NhdWx0cyIpKw0KICB4bGFiKCJEYXRlIikrDQogIHRoZW1lKA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iDQogICAgKSsNCg0KICAjIFNldCB0aGUgbGVnZW5kIHRvIG11bHRpcGxlIHJvd3MNCiAgZ3VpZGVzKGNvbCA9IGd1aWRlX2xlZ2VuZChucm93ID01KSkrDQogIA0KICAjIFdyYXANCiAgZmFjZXRfd3JhcCh+IGZhY2lsaXR5LCBuY29sPTMpDQpgYGANCg0K